package com.bub.pay.framework.common.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 时间工具类,使用java8处理时间的方式添加方法
 */
public interface DateUtil {
    /**
     * Date转LocalDateTime
     *
     * @param date Date对象
     * @return
     */
    static LocalDateTime dateToLocalDateTime(Date date) {
        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
    }

    /**
     * LocalDateTime转换为Date
     *
     * @param dateTime LocalDateTime对象
     * @return
     */
    static Date localDateTimeToDate(LocalDateTime dateTime) {
        return Date.from(dateTime.atZone(ZoneId.systemDefault()).toInstant());
    }

    static Date localDateToDate(LocalDate localDate) {
        if (null == localDate) {
            return null;
        }
        ZonedDateTime zonedDateTime = localDate.atStartOfDay(ZoneId.systemDefault());
        return Date.from(zonedDateTime.toInstant());
    }

    //Date 转 localDate
    static LocalDate dateTolocalDate(Date date) {
        if (null == date) {
            return null;
        }
        Instant instant = date.toInstant();
        ZoneId zoneId = ZoneId.systemDefault();
        return instant.atZone(zoneId).toLocalDate();
    }

    /**
     * 获取指定日期当天开始时间
     *
     * @param date 日期
     * @return 当前开始时间
     */
    static Date getDateStartTime(Date date) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar.getTime();
    }

    /**
     * 获取指定日期当天结束时间
     *
     * @param date 日期
     * @return 当前结束时间
     */
    static Date getDateEndTime(Date date) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.set(Calendar.HOUR_OF_DAY, 23);
        calendar.set(Calendar.MINUTE, 59);
        calendar.set(Calendar.SECOND, 59);
        calendar.set(Calendar.MILLISECOND, 999);
        return calendar.getTime();
    }

    static int differentDaysByMillisecond(Date date1, Date date2) {
        int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
        return days;
    }

    /**
     * 时间格式化
     *
     * @param date    时间
     * @param pattern 格式化
     * @return 时间字符串
     */
    static String format(Date date, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        return sdf.format(date);
    }

    /**
     * 字符串转时间
     *
     * @param dataStr 时间字符串
     * @param pattern 格式化
     * @return 时间
     */
    static Date parse(String dataStr, String pattern) {
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
        try {
            return sdf.parse(dataStr);
        } catch (ParseException e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 时间增加（小时）
     *
     * @param date  时间
     * @param hours 增加时间
     * @return 增加结果
     */
    static Date plusHours(Date date, int hours) {
        if (hours == 0) {
            return date;
        }

        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR_OF_DAY, hours);
        return calendar.getTime();
    }

    /**
     * 获取时间的之前几个小时
     *
     * @param date 原始时间
     * @param i    几个小时
     * @return 之前的时间
     */
    static Date getDateBeforeHours(Date date, int i) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.HOUR_OF_DAY, -i);
        return calendar.getTime();
    }

    /**
     * 获取时间的之前几个分钟
     *
     * @param date 原始时间
     * @param i    几分钟
     * @return 之前的时间
     */
    static Date getDateBeforeMinute(Date date, int i) {
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.MINUTE, -i);
        return calendar.getTime();
    }

    /**
     * 获取日志之前几天的时间
     *
     * @param date 日志
     * @param i    几天
     * @return 之后的时间
     */
    static Date getDateBeforeDay(Date date, int i) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DATE, -i);
        return c.getTime();
    }

    /**
     * 获取日志之后几天的时间
     *
     * @param date 日志
     * @param i    几天
     * @return 之后的时间
     */
    static Date getDateAfterDay(Date date, int i) {
        Calendar c = Calendar.getInstance();
        c.setTime(date);
        c.add(Calendar.DATE, i);
        return c.getTime();
    }
}
